﻿#region Copyright Notice
// This file is part of GestionPedago.
// <description>
// Copyright (C) 2012 ENI Ecole Informatique
// 
// GestionPedago is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// <program> is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionPedago.EntityContext;
using GestionPedago.EntityContext.EntityOPTools;
using System.Linq.Expressions;
using System.Data.Objects;
using System.Data;

namespace GestionPedago.Persistence.OPManager
{
    /// <summary>
    /// Manager de persistance de l'entity EvenementPedagogique
    /// </summary>
    public abstract class EvenementPedagogiqueOPManager
    {
        /// <summary>
        /// Méthode d'ajout d'un évènement pédagogique
        /// </summary>
        /// <param name="evt">L'entity a ajouter en base</param>
        /// <returns>L'entity créé en base</returns>
        public static EvenementPedagogique AjouterEvenementPedagogique(EvenementPedagogique evt)
        {
            try
            {
                Alerte a = null;
                if (evt.Stagiaire != null)
                {
                    EntityConnection.GetContext().Stagiaire.Detach(evt.Stagiaire);
                }
                if (evt.Alerte != null)
                {
                    a = evt.Alerte;
                    EntityConnection.GetContext().Alerte.Detach(a);
                }
                if (evt.Contact != null)
                {
                    EntityConnection.GetContext().Contact.Detach(evt.Contact);
                }
                if (!EntityStateChecker.IsDetached(evt))
                {
                    EntityConnection.GetContext().EvenementPedagogique.Detach(evt);
                }
                EntityConnection.GetContext().EvenementPedagogique.AddObject(evt);

                if (a != null)
                {
                    evt.Alerte = AlerteOPManager.AjouterAlerte(a);
                }

                EntityConnection.GetContext().SaveChanges();

                return evt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Méthode de suppression d'un évènement pédagogique
        /// </summary>
        /// <param name="evt">L'entity à supprimer</param>
        public static void SupprimerEvenementPedagogique(EvenementPedagogique evt)
        {
            try
            {
                if (evt.EntityState == EntityState.Detached)
                {
                    evt = GetEvenementPedagogiqueById(evt.IdEvenementPedagogique);
                }

                if (evt.Alerte != null)
                {
                    AlerteOPManager.SupprimerAlerte(evt.Alerte);
                }

                EntityConnection.GetContext().EvenementPedagogique.DeleteObject(evt);

                EntityConnection.GetContext().SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        /// <summary>
        /// Méthode de récupération d'un évènement pédagogique en base à partir de son id
        /// </summary>
        /// <param name="idEvenementPedagogique">L'id de l'évènement pédagogique à récupérer</param>
        /// <returns>L'entity récupéré en base</returns>
        public static EvenementPedagogique GetEvenementPedagogiqueById(int idEvenementPedagogique)
        {
            try
            {
                var query = from it in EntityConnection.GetContext().EvenementPedagogique
                            where it.IdEvenementPedagogique == idEvenementPedagogique
                            select it;

                return query.First();

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Méthode qui retourne une liste d'évènements pédagogiques en fonction des critères en paramètre
        /// </summary>
        /// <param name="codeStagiaire">Le code stagiaire</param>
        /// <param name="domainesActivite">La liste des domaines d'activité</param>
        /// <param name="intervenants">La liste des intervenants</param>
        /// <param name="dateEcheance">La date d'échéance</param>
        /// <returns>La liste des évènements pédagogiques trouvés</returns>
        public static List<EvenementPedagogique> GetListEvenementsPedagogiques(int? codeStagiaire, List<String> domainesActivite, List<Int32> intervenants, DateTime? dateEcheance)
        {
            List<EvenementPedagogique> listeEvenements = new List<EvenementPedagogique>();

            IQueryable<EvenementPedagogique> query = EntityConnection.GetContext().EvenementPedagogique;

            // Filtre sur le codeStagiaire
            if (codeStagiaire != null)
            {
                query = query.Where(it => it.Stagiaire.CodeStagiaire == codeStagiaire);
            }

            // Filtre sur les domaines d'activité
            if (domainesActivite != null && domainesActivite.Count > 0)
            {
                query = query.Where(EntityExpressionTools.BuildWhereInExpression<EvenementPedagogique, String>(it => it.TypeEvenement.CodeNature, domainesActivite));
            }

            // Filtre sur les intervenants
            if (intervenants != null && intervenants.Count > 0)
            {
                query = query.Where(EntityExpressionTools.BuildWhereInExpression<EvenementPedagogique, Int32>(it => it.ContactENI.CodeContactENI, intervenants))
                            .Union(query.Where(EntityExpressionTools.BuildWhereInExpression<EvenementPedagogique, Int32>(it => it.ContactENI1.CodeContactENI, intervenants)));
            }

            // Filtre sur la dateEcheance
            if (dateEcheance != null)
            {
                query = query.Where(it => EntityFunctions.TruncateTime(it.DateEvenement) >= dateEcheance);
            }

            return query.ToList();
        }


    }
}
